package com.cino.demos.controller.file;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class PlainJavaDownload {

    public static void main(String[] args) {
        System.out.println("开始使用纯Java IO进行下载...");

        // 1. 定义要下载的资源的URL
        //    我们用一个国内能稳定访问的Maven仓库文件作为例子
        String fileUrl = "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.8/gson-2.8.8.jar";

        // 2. 定义文件保存在本地的路径和文件名
        Path savePath = Paths.get("downloaded_file_plain_java.jar");

        HttpURLConnection connection = null;
        try {
            // 3. 创建URL对象
            URL url = new URL(fileUrl);

            // 4. 打开网络连接，并进行相关设置
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(15000); // 15秒连接超时
            connection.setReadTimeout(15000);    // 15秒读取超时
            connection.setRequestMethod("GET");  // 下载是GET请求

            System.out.println("已连接到服务器，准备下载...");

            // 5. 获取输入流 (InputStream)
            //    try-with-resources 会自动关闭输入流 in
            try (InputStream in = connection.getInputStream()) {

                // 6. 使用Java NIO的Files.copy方法完成核心IO操作
                //    这一行代码是现代Java推荐的写法，它在内部高效地完成了
                //    BufferedOutputStream的创建、while循环读取、关闭流等所有操作。
                //    它就是对经典IO模型的一个高级封装！
                Files.copy(in, savePath, StandardCopyOption.REPLACE_EXISTING);
            }

            System.out.println("下载成功！文件已保存到: " + savePath.toAbsolutePath());

        } catch (Exception e) {
            System.out.println("下载失败，发生错误！");
            e.printStackTrace();
        } finally {
            // 7. 断开网络连接
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}